接下來,我們要進入到更深一層的NLP境界了,也就是『Transformers
』。paper link如下:
- Attention is all you need.
這部分也會以探討paper的方式為主,讓我們就直接開始吧。
Introduction
先前我們提到了許多attention
,seq2seq
等架構,幾乎都是圍繞在RNN
這樣的神經網路去做一個提出與實作。但其實我們都知道在RNN
的架構當中,他的特性就是Sequence
計算,而這樣的特型卻也形成無法做到平行化
的計算,進而遇到效能上與長句子等相關問題。
而在這篇paper當中就是透過Transformers
這樣的架構來避開像是RNN這樣的model,而是採用全Attnention
的方式來做到序列以及平行化的計算。
Background
作者在這部分提到了self-attention
,如果各位讀者還有印象的話,在前一篇我們有針對Attention分類
做了一些探討,其中就有提到了self-attention
。該類別也稱之為intra-attention
,簡單來說就是與同句子
的其他word做attention的機制,而不是過往兩個sequenece互相做attention的機制。然而透過self-attention
這樣的作法,我們可以理解到在不同位置的word對於該單序列的重要程度關係,利用這個方式計算出representation。
然而本篇所要提出的Transformers
架構則是建立於全attention
且不需要透過RNN
和CNN
等相關model來實作的Seq2Seq
模型。在接下來的章節會在個別探討Transformers
, self-attention
是如何做到的。
Model Architecture
在Seq2Seq
這樣的架構當中,我們得知到了Encoder
和Decoder
這樣的概念。Encoder
將輸入sequence (𝑥1,𝑥2,⋯,𝑥𝑛) 對應到一個連續的表達序列 z=(𝑧1,𝑧2,⋯,𝑧𝑛) 。而再由 Decoder
生成一個sequence作為輸出 (𝑦1,𝑦2,⋯,𝑦𝑚) 。 模型的每一個步驟都是自迴歸(Auto-Regressive
) 的,利用先前的輸出作為輸入來預測下一個輸出。而Transformers
則遵循這樣的架構利用self-attention
,fully-connected
, point-wise
等方式來做到Encoder
和Decoder
,架構呈現如下:
3.1 Encoder and Deocder Stack
Encoder
Encoder
是由N=6所堆疊出來的,其中一次堆疊會包含2個sublayer,分別是multi-head attention
和position-wise FFN
,其中在每一個sublayer之間會在加入了一個Residual Connection
,在透過layer normalization
,因此在每一格sublayer的output都會是
LayerNorm(𝑥+Sublayer(𝑥))
[補充]Residual Connection(殘差連接)
簡單來說為了在深度學習的架構中,一般的認知會是深度越深效果越好(identity-mapping),但事實上有可能當深度增加時,反而會使準確度退化(Training Error增加),可能是參數量太大難以優化之原因,所以必須要改用其他方式來做處理。根據Deep Residual Learning for Image Recognition這篇paper的內容,可以簡單理解成如下圖:
最左邊的圖是一般我們在做神經網路傳遞的狀態,我們把中間的layer想像成H()
,所以output就會是H(x)
,但如同前面所提到的,有可能會造成error增加進而退化,所以後來改成中間的圖,扣除掉input
x,但其實這樣還不太夠,後來改變成shortcut connection
,就是跨層傳遞
,來讓資訊做傳遞 - F(x)+x = H(x)
,如此一來一方面不會增加額外計算複雜度,同時也可以避免不會被其他的layer所影響output,最重要的是在backprpagation
更容易回到source layer,也就是保留原先的input,避免產生梯度消逝之問題。這樣的架構就可以在Transformer
的Encoder & Decoder
內部看到。
[補充] Layer Normalization
在說明Layer Normalization
之前,先快速提一下他的始祖Batch Normalization
的問題,詳細paper內容在Batch Normalization: Accelerating Deep Network Training byReducing Internal Covariate Shift。
Batch Normalization
主要是根據每一個batch-data去計算平均值
與標準差
,在進而normalize
,所以可能會有幾個缺點:
1. 依賴batch_size: batch_size小的時候,效果會很差
2. 不適用序列化資料(若採用用在RNN stack之間)
3. 只能再訓練階段使用,原因在於若在使用到『predict階段』,model學習到的是最後一個batch的平均值與標準差,如果該batch是偏離原本母體的話,就會造成在predict會有影響與誤差。
sol: 有學者說額外紀錄每一次batch 的 平均值與標準差,最後在平均,只是就需要額外的空間作紀錄。
而Layer Normalization
則是對同一layer的output
做normalize,因此不會受到Batch_size
影響,也可以很好地應用到序列性資料。詳細paper可以看此Layer Normalization
Decoder
然而Decoder
也是由N=6所堆疊出來的,與Encoder
差別不一樣在地方是在原本的2個sublayer中間插入一個新的sublayer,其連接Encoder
的output進行multi-head attention
。其餘都與 Encoder 部分相同,每一個子層均有 Residual Connection,並進行 Layer Normalization。
此外,作者們也在Decoder
修改了第一個sublayer的input,加上一個Mask
,來確保對位置 𝑖 的預測只能依賴位置 < 𝑖 的已知output來做預測。
3.2 Attention
在Attention
這個部分,我們先知道會有三個vector,分別是Query, Key 和 Value。簡單來說作者提到透過Compatibility Function
可將Query, Key計算出Value的權重值,再經由value的加權總和求出output。接著作者在此提出了其中Transformers
運用到了兩個attentionn。如下圖:
Scaled dot-product Attention
這個部分是將Query, 每個維度d之Key, Value做input,也就是將Query與每個維度Key做Dot-Product
(時間複雜度 n^2),接著除上√‾‾‾𝑑𝑘
,再使用 Softmax 函數得到 Value 的權重。對應的矩陣運算公式如下:
作者在此有提到Additive Attention
與 Dot-Product Attention
。在Dot-Product Attention
除上√‾‾‾𝑑𝑘
的原因在於因為dot-product
後的數值,有些很大有些很小,所以透過縮放因子可以促使大者更大,小者更小
進而使區分更加明顯。
[補充]Additive Attention
Additive Attention
是將Query與Key做concat再輸入計算,假設Key由[k1,k2....kn]組合而成,就會變成先concatQ-k1
,在concatQ-k2
最後計算出來後再套用到softmax得權重值。
[補充]Dot-Product Attention
Dot-Product Attention
則用於矩陣運算
,Query,Key,Value為三個矩陣,Dot-Product Attention
想做的是一樣拿Query與key做關聯(Query, key維度要相同),在與矩陣Value做權重和。
簡單的流程架構如下:
拿Query與每一個Key去做attention,求出權重
再經由softmax來獲得權重值
接著再拿權重值與Value做權重和來取得output
Multi-head Attention
作者們認為將 Queries, Keys, Values 分別進行 ℎ 次線性映射到維度 𝑑𝑘, 𝑑𝑘 與 𝑑𝑣 是有利的。因此利用每一次 Queries, Keys, Values 的project都會平行計算 Attention function,各產生一個維度 𝑑𝑣 。最後將這 ℎ 個向量concat
在一起再做一次線性得到最終的結果值。而這樣的做法就是允許模型在不同的位置上可以同時關聯Representation Subspace。
作者們以 ℎ=8 個平行計算,且 𝑑𝑘=𝑑𝑣=𝑑𝑚𝑜𝑑𝑒𝑙 / ℎ,這可以降低每一個注意力機制的維度,進而減少運算成本,保持跟Single-Head Attention一樣的維度。
簡單的架構流程如下(h=2):
將原先的Query, Key與value 降維到個別維度上。
個別求出每一個維度的output
最後再concat成整體的output
3.2.3 Applications of Attention in our Model
- Encoder & Decoder
將先前Decoder
的輸出作為 Query,以Encoder
的輸入作為 Key 與 Value,使每一個位置在Decoder
中都可以得到輸入序列的其它位置的訊息。 - Encoder
Encoder
中包含了一個Self-Attention Layer
,所有的 Queries, Keys, Values 都來自於同一個位置,這能使每一個位置在Encoder
中都可以得到先前layer中所有輸出。 - Decoder
Decoder 中的Mask Self-Attention Layer
,只允許 Decoder 可以關注到包含自身位置之前所有位置的訊息。該目的為了因為每一個位置的預測都應該只與前面的位置有關,不該讓後面位置的資訊影響到當下位置的預測。在論文中,便將非法連接 (後向前傳遞) 的 Softmax 值均設置為 −∞,達成 Mask 的效果。
這邊呈現Google說明的例子呈現。
這邊可以快速整體一個結論:
* Attention讓 Decoder 在生成輸出元素的 representation. 時關注 Encoder 的輸出序列,進而取得上下文資訊
* self-Attention讓 Encoder 在生成輸入元素的 representation. 時關注自己序列中的其他元素,進而取得上下文資訊
* self-Attention讓 Decoder 在生成輸出元素的 representation. 時關注自己序列中的其他元素,進而取得上下文資訊
無論是Attention
或是Self-Attention
都是讓Query關注Key,再計算出Value權重與Value得出整體上下文資訊,只是採用的Sequence不同。
Transformer Mask
在Mask
的機制當中,Transformer
採用了2種技巧,分別是Padding Mask
與 Sequence Mask
。
- Padding Mask
無論是Encoder
或Decoder
都會採用到該mask方式,用來確保input sequence的長度一致。 - Sequence Mask
發生在Decoder
,用來確保再訓練Transformer
的時候避免知道接下來要生成的token之答案,來影響訓練結果,所以需要mask。套用到生成會產生類似如下的結果:
3.3 Position-wise Feed-Forward Networks
在一開始Transformer
的架構當中,我們都知道無論是Encoder
或Decoder
都可以看出會包含一個Feed-Forward Networks
,該元件包含了兩次的linear Transformation
以及加入一個ReLU activation function
:
其中input、output的維度都是 𝑑𝑚𝑜𝑑𝑒𝑙=512,中間層維度則是 𝑑𝑓𝑓=2048,進而促使model能夠學習更到high-level的與減少 fully-connected 的計算量。
3.4 Embeddings and Softmax
這邊簡單來說就是將 Embedding layer
和 presoftmax layer
的參數做shared matrix
處理,然而在Embedding layer
除上𝑑𝑚𝑜𝑑𝑒𝑙做縮放權重。
因為在Encoder
的input經過embedding的維度,與Decoder
的input計算出來的維度是相同的,然而都會呈上一個weight matrix
,會這樣做的原因在於要讓Decoder
的output在倒傳遞時獲得最大的update,但同時也希望讓Encoder
和Decoder
的input也能適時地去做update,因此才共享matrix。
3.5 Positional Encoding
在Transformer
model架構當中,其實不包含RNN的序列關係在裡面,所以對於該model來說,ex.你,好
與好,你
對model來說並沒有太大差別,因此如果要讓該model具備訓練sequence的順序的話,在先前我們提到,可以加入額外的embedding,來作為position的資訊,也就是Positional Encoding
。然而在Transformer
是如何做到這件事情的呢?其實就是採用sin
&cos
。
𝑝𝑜𝑠 指的是這個 token 在序列中的位置,而 𝑖 代表的第i個維度,就會是這個token的第i維度。然後整個位置編碼的維度會對應到一個三角函數
。使用三角函數
主要是因為作者們認為這樣的函數可以有利於作者們認為這樣的函數可以有利於模型輕鬆的學習到相對位置
的編碼,因為對任意的偏移量 𝑘 來說,𝑃𝐸𝑝𝑜𝑠+𝑘 都可以表示成為 𝑃𝐸𝑝𝑜𝑠 的線性組合。同時在不同的維度也採用道不同的function做位置計算。
這邊假設一個例子,若 𝑝𝑜𝑠=1
,所產生的positional encoding
呈現如下:
而採用三角函數
主要是可以滿足幾個條件:
1.必須可以識別一個單字(詞)在不同位置上在不同位置上可能有不同的意義
2.必須可以體現不同先後順序的關係
3.編碼數值落在區間 [0,1] 之間
4.編碼維度可以不受限於文本長度
Why self-attention?
作者採用了三個觀點來提出為什麼要採用self-attention
:
- total computational complexity per layer.
- the amount of computation that can be parallelized
- the path length between long-range dependencies in the network.
從這三個觀點,作者拿出RNN, Convolution等model來做比較。
簡單來說,在過往的Sequence
作法,在當前的output必須仰賴之前的資訊,就會造成無法平行化的計算。而Transformer
則是全部轉成矩陣運算,進而可平行化與GPU加速,也可能取得距離較遠的資訊。
Training & Result
Hardware and Schedule
作者 採用了8 顆 Nvidia P100 GPU 的電腦進行訓練,對於論文中所設置超參數的Base模型,每一次訓練 ( training step ) 約 0.4 秒。對於Big模型而言,則每次訓練時間需要約 1.0 秒,一共接受了 300,000 次或約 3.5 天的訓練時間。
Optimizer
作者採用Adam
+Warmup
來設計optimizer
,參數設定如下:
𝛽1=0.9
𝛽2=0.98
𝜖=10−9
作者根據 𝑤𝑎𝑟𝑚𝑢𝑝_𝑠𝑡𝑒𝑝𝑠 ( paper中設置為 4000 ) 線性增加學習率,再經由訓練次數的平方根倒數來降低學習率。
Regularizer
Residual Dropout
每一個sublayer的output後,Normalization 前都添加 Dropout,此外,在 Encoder 與 Decoder 中,對於 token 與position encoding
加總的部分也添加 Dropout。 其中, 𝑃𝑑𝑟𝑜𝑝=0.1Label Smoothing
訓練中還進行了 𝜖𝑙𝑠=0.1 的 Label Smothing。雖然這樣會讓整個模型變得更加不穩定,但卻提高了準確度與 BLEU 分數。
Machine Translation
作者採用了英德語言資料翻譯
和英法語言資料翻譯
之任務作為實驗,實驗結果參考如下:
作者們對Transformer-Base
model使用的是最後 5 個 Checkpoints 之平均來得到最終的模型,而對於Transformer-Big
,則是透過最後 20 個 Checkpoint 平均來取得最終模型。而作者們利用 𝐵=4 及 𝛼=0.6 來做Beam-search
,這些參數的決定是經過實驗後選擇的。
Model Variations
作者們也嘗試更改了參數值,來看看在不同的設定上,Transformer
所帶來的效果為何,後來整理成如下表:
在(A)不難發現作者們改變了 Head 數量、Key 與 Value 的大小使其計算量保持不變。然而Single-Head Attention
較Multi-Head Attention
的表現來的差,但 Head 數量過多時,整體model效果也會下降。
在(B)中,作者發現當減少 𝑑𝐾𝑒𝑦 值會損害模型的質量,這表明了決定相容性函數並非是一件容易的事情,且相較於Dot-product
更複雜的相容性函數可能會有其益處。在 (C) (D) 中,可以更進一步的發現,正如期待較大的模型表現會較好,且 Dropout 有助於避免 Overfitting。在 (E) 中,作者將學習而得的位置編碼以正弦函數來做替換,可以發現結果會與基本 Transformer 的結果幾乎相同。
Conclusion
這邊最後概要一下Transformer
的幾個重點作為結論:
Self-Attention
的input/output
都是Sequence
,差別在於可平行計算。此外也會將input embedding
轉換成Query
,Key
與Value
等三個矩陣進而求出權重和,最後產生output。Multi-head Attention
則是將Query
,Key
與Value
投影到各維度的dq
,dk
和dv
來學習到每個位置在不同維度的representation
。Self-Attention
在計算每次的位置時,都會關注其他位置的資訊。Self-Attention
並沒有先後順序關係,所以才可快速平行運算。也因此要額外加入Positional Encoding
來知道順序(非訓練出來)。Encoder & Decoder
都包含了Multi-head Attention
和Feed Forward Network
,其中Decoder
多了Encoder
的Multi-head Attention
,並且把第一個sublayer改變成Masked Multi-head Attention
避免受到該預測位置後的結果影響。
Reference
- Attention Is All You Need
- Deep Residual Learning for Image Recognition
- Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
- Convolutional Sequence to Sequence Learning
- Using the Output Embedding to Improve Language Models
- Layer Normalization
- Transformer: A Novel Neural Network Architecture for Language Understanding
- 从语言模型到Seq2Seq:Transformer如戏,全靠Mask
- Transformer -encoder mask篇
- Transformer -decoder mask篇
- Transformer详解(二)——Self-Attention机制详解
- Transformer详解(三)——Attention is all you need
- Batch Normalization
- Layer Normalization解析
- 李鴻毅老師Transformer - PDF.pdf)
- 淺談神經機器翻譯& 用Transformer 與TensorFlow 2 - LeeMeng
- 論文筆記 Convolutional Sequence to Sequence Learning
- 论文总结(Transformer中Embedding部分提到的权重共享)